package com.example.javaproject;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.TreeMap;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore.Audio.Media;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;

public class List extends Activity {

	// 声明组件对象
	boolean isStop;
	boolean flag;
	// 内容提供者
	ListView songsList;
	ImageView songsstop;
	ImageView songsstart;
	ImageView songspause;
	TextView singerMusic;

	ArrayList<String> songList; // 定义一个List集合，用于存储歌曲的名称
	ArrayList<String> pathList; // 定义一个List集合，用于存储歌曲的路径
	ArrayList<String> albumList;// 定义一个List集合，用于存储专辑的名称
	ArrayList<String> singerList;// 定义一个List集合，用于存储歌手的名字
	int songsPosition;

	ArrayList<String> songList2;
	ArrayList<String> pathList2;

	Uri uri = Media.EXTERNAL_CONTENT_URI; // 指定要访问的内容提供者的Uri
	ContentResolver cr;
	ArrayAdapter<String> adapter; // 数据适配器，用于加载数据给ListView
	MediaPlayer songsmp;
	int currentPostion;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_list);

		// 获取组件对象
		songsList = (ListView) findViewById(R.id.songsList);// 查找视图
		songsstop = (ImageView) findViewById(R.id.songsstop);
		songsstart = (ImageView) findViewById(R.id.songsstart);
		songspause = (ImageView) findViewById(R.id.songspause);
		singerMusic = (TextView) findViewById(R.id.singerMusic);

		// 对象实例化
		songList = new ArrayList<String>();
		pathList = new ArrayList<String>();
		albumList = new ArrayList<String>();
		singerList = new ArrayList<String>();

		songList2 = new ArrayList<String>();
		pathList2 = new ArrayList<String>();

		cr = getContentResolver(); // 直接调用Activity类有的getContentResolver获取一个内容解析器实例
		songsmp = com.example.javaproject.MainActivity.albumMp;

		String[] columns = { Media.TITLE, Media.DATA, Media.ALBUM, Media.ARTIST };// {歌名，路径，专辑名，歌手名}

		Cursor c = cr.query(uri, columns, null, null, null);
		while (c.moveToNext()) {
			songList.add(c.getString(0)); // 将歌曲名称（第一列）加入到songList集合
			pathList.add(c.getString(1)); // 将该行第二列的路径加入到pathList集合
			albumList.add(c.getString(2));
			singerList.add(c.getString(3));
		}

		for(int i=0;i<songList.size();i++){
			songList2.add(songList.get(i));
		}
		for(int j=0;j<pathList.size();j++){
			pathList2.add(pathList.get(j));
		}

		// 设置监听器
		MyListener listener = new MyListener();
		songsstart.setOnClickListener(listener);
		songspause.setOnClickListener(listener);
		songsstop.setOnClickListener(listener);
		singerMusic.setOnClickListener(listener);

		// ---------------------------------JJH-------------------------------------
		// 将songList排好序
		songList = updateSongListByPlayCount(songList);
		// 将pathList排好序
		pathList = updatePathList(pathList, songList);
		// ----------------------------------------------------------------------

		// 四个参数：上下文，ListView每个选项的样式Layout编号，具体样式视图编号，数据列表
		adapter = new ArrayAdapter<String>(List.this, R.layout.item,
				R.id.tvItem, songList);
		songsList.setAdapter(adapter);

		// 点击之前显示第一个音乐
		singerMusic.setText(songList.get(0));
		// 要处理ListView的选项点击事件
		songsList.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				// ---------------------------------------------------------------------------------------------

				PrintWriter pw = null;
				BufferedReader br = null;
				// 创建一个文件用于记录歌曲播放时间
				File file = new File(Environment.getExternalStorageDirectory()
						.toString() + "/" + songList.get(position) + ".txt");
				// 如果文件不存在，也就是第一次播放该歌曲
				try {

					if (!file.exists()) {
						// 初始化字符输出流
						pw = new PrintWriter(new FileOutputStream(file));
						// 设置初始播放次数为1
						pw.write("1");
						pw.flush();// 刷新缓冲区

					} else {
						// 文件存在，也就是以前播放过该歌曲

						// 用于读文件
						br = new BufferedReader(new FileReader(file));
						// 先读取以前的播放次数
						String count = br.readLine();

						// 用于写文件
						pw = new PrintWriter(new FileOutputStream(file));
						// 重新写入文件 设置新的播放次数为原来次数+1
						pw.println((Integer.parseInt(count) + 1) + "");
						pw.flush();// 刷新缓冲区

					}
				} catch (Exception e) {
					e.printStackTrace();
				}

				// ---------------------------------------------------------------------------------------------

				songsPosition = position;
				singerMusic.setText(songList.get(position));
				try {
					songsmp.reset(); // 每次重置MediaPlayer，然后才能重新指定资源
					// 设置数据源，从pathList获取position位置的歌曲的路径
					// Toast.makeText(List.this,pathList.get(position),
					// Toast.LENGTH_SHORT).show();
					songsmp.setDataSource(pathList.get(position));
					songsmp.prepare();
					songsmp.start();
					isStop = false;
				} catch (Exception e) {
					Log.e("MainActivity", e.getMessage());
				}
			}
		});

	}

	// -----------------------------------传进来所有歌曲的集合
	// 修改成排好序的集合---------------------------------------------
	public ArrayList<String> updateSongListByPlayCount(
			ArrayList<String> songList) {
		// 播放次数 歌曲名
		TreeMap<String, String> map = new TreeMap(new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				int count1 = Integer.parseInt(o1);// 要添加的元素（新元素） 播放次数
				int count2 = Integer.parseInt(o2);// 已经存在的元素（老元素） 播放次数
				// 如果两个播放次数不同 按照降序排序
				if (count1 != count2) {
					return count2 - count1; // 新元素 - 老元素 升序 老元素 - 新元素 降序 所以这里是降序
				}
				return 1; // 如果两个播放次数相同 则return1表示按照先来后到的顺序 排序

			}
		});

		/*
		 * map集合 中存储的是这样子的
		 * 
		 * 播放次数 歌曲名 53 修炼爱情 32 说好不哭 15 一路向北 5 告白气球 1 爸爸去哪
		 */

		// 字符输入流 用于读取每个歌曲的文件
		BufferedReader br = null;

		// 查询每一首歌曲的播放次数放入map集合
		for (String name : songList) {
			// 获取每一首歌的文件
			File file = new File(Environment.getExternalStorageDirectory()
					+ "/" + name + ".txt");
			// Toast.makeText(
			// this,
			// Environment.getExternalStorageDirectory() + "/" + name
			// + ".txt", Toast.LENGTH_SHORT).show();
			if (!file.exists()) {
				// 如果文件不存在 说明歌曲还没播放过 查询不出count （防止 第一次歌曲没有播放过 获取不了count）
				map.put("0", name);
				continue;
			} else {
				// 如果文件存在 可以查询出count
				try {
					// 用于读文件
					br = new BufferedReader(new FileReader(file));
					// 读取每一首歌文件中的播放次数
					String count = br.readLine();
					// 放入map集合（此时map集合的值已经是排好序的 歌曲集合了）
					map.put(count, name);

				} catch (Exception e) {
					e.printStackTrace();
				}

			}
		}

		// 清空songList
		songList.clear();
		Collection<String> new_Music_List = map.values();

		// 修改成排好序的新list
		songList.addAll(new_Music_List);

		return songList;

	}

	// 根据songList 更新pathList
	public ArrayList<String> updatePathList(ArrayList<String> pathList,
			ArrayList<String> songList) {
		ArrayList<String> path2=new ArrayList<String>();
		for (int i = 0; i < songList.size(); i++) {
			for (int j = 0; j < songList.size(); j++) {
				if (songList.get(i).equals(songList2.get(j))) {
					path2.add(pathList2.get(j));
					break;
				}
			}
		}
		return path2;
	}

	// 每次回到该活动时会调用
	@Override
	protected void onResume() {
		super.onResume();
		// 将songList排好序
		songList = updateSongListByPlayCount(songList);
		// 将pathList排好序
		pathList = updatePathList(pathList, songList);
		// 重新设置listView

		// 四个参数：上下文，ListView每个选项的样式Layout编号，具体样式视图编号，数据列表
		adapter = new ArrayAdapter<String>(List.this, R.layout.item,
				R.id.tvItem, songList);
		songsList.setAdapter(adapter);
	}

	// 监听器
	class MyListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.songsstart:
    			Toast t3=Toast.makeText(List.this,"上一首",Toast.LENGTH_SHORT);
    			t3.show(); 
				if(songsPosition>=1&&songsPosition<=songList.size()){

					try {
						singerMusic.setText(songList.get(songsPosition-1));
						songsmp.reset();
						songsmp.setDataSource(songList.get(songsPosition-1));
						songsPosition=songsPosition-1;
						songsmp.prepare();
						songsmp.start();
					} catch (IOException e) {
						e.printStackTrace();
					}
    			}else{
					try {
						singerMusic.setText(songList.get(songList.size()-1));
						songsmp.reset();
						songsmp.setDataSource(pathList.get(songList.size()-1));
						songsPosition=songList.size()-1;
						songsmp.prepare();
						songsmp.start();
					} catch (IOException e) {
						e.printStackTrace();
					}
    			}
				break;
			case R.id.songspause:
				if(!isStop){
					songspause.setImageDrawable(getResources().getDrawable(R.drawable.start));
	    			Toast t2=Toast.makeText(List.this,"已暂停",Toast.LENGTH_SHORT);
	    			t2.show(); 
	    			songsmp.pause();
					isStop = true;
					flag=isStop;
				}else {
					songspause.setImageDrawable(getResources().getDrawable(R.drawable.pause));
					songsmp.start();
	    			Toast t1=Toast.makeText(List.this,"播放",Toast.LENGTH_SHORT);
	    			t1.show(); 
	    			isStop = false;
					flag=isStop;
				}
				break;
			case R.id.songsstop:
    			Toast t4=Toast.makeText(List.this,"下一首",Toast.LENGTH_SHORT);
    			t4.show(); 
				if(songsPosition>=0&&songsPosition<=songList.size()-2){

					try {
						singerMusic.setText(songList.get(songsPosition+1));
						songsmp.reset();
						songsmp.setDataSource(pathList.get(songsPosition+1));
						songsPosition=songsPosition+1;
						songsmp.prepare();
						songsmp.start();
					} catch (IOException e) {
						e.printStackTrace();
					}
    			}else{
					try {
						singerMusic.setText(songList.get(0));
						songsmp.reset();
						songsmp.setDataSource(pathList.get(0));
						songsPosition=0;
						songsmp.prepare();
						songsmp.start();
					} catch (IOException e) {
						e.printStackTrace();
					}
    			}
				break;			case R.id.singerMusic:
				currentPostion = songsmp.getCurrentPosition();
				Intent individual1 = new Intent(List.this,
						IndividualSongs.class);
				individual1.putExtra("albumName", albumList.get(songsPosition));
				individual1.putExtra("songsName", songList.get(songsPosition));
				individual1.putExtra("singerName",
						singerList.get(songsPosition));
				individual1.putExtra("songsPath", pathList.get(songsPosition));
				individual1.putExtra("currentPostion", currentPostion);
				individual1.putExtra("flag", flag);
				startActivity(individual1);
				break;
			}
		}
	}

}
